package com.yssoft.service.core;

import java.util.ArrayList;
import java.util.Arrays;
import java.util.Date;
import java.util.HashMap;
import java.util.HashSet;
import java.util.List;
import java.util.Map;
import java.util.Set;

import com.alibaba.fastjson.JSONObject;
import com.google.common.collect.Lists;
import com.yssoft.entity.core.TFunctions;
import com.yssoft.entity.core.TRoles;
import com.yssoft.mapper.core.TDepartmentMapper;
import com.yssoft.mapper.core.TFunctionsMapper;
import com.yssoft.mapper.core.TPersonnelMapper;
import com.yssoft.mapper.core.TRolesMapper;
import com.yssoft.shiro.MyRealm.ShiroUser;
import com.yssoft.utils.UserHelper;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Propagation;
import org.springframework.transaction.annotation.Transactional;

@Transactional(rollbackFor = Exception.class, propagation = Propagation.REQUIRED)
@Service
public class RoleService
{
	@Autowired
	protected TRolesMapper rolesMapper;
	@Autowired
	protected TPersonnelMapper personnelMapper;
	@Autowired
	protected TDepartmentMapper departmentMapper;
	@Autowired
	protected TFunctionsMapper functionsMapper;
	
	/**
	 * @方法名称: findOne
	 * @功能描述: 获取唯一角色数据
	 * @作者:洪丰
	 * @创建时间:2018年4月24日 上午11:34:10
	 * @param id
	 * @return TRoles
	 */
	public TRoles queryRoleById(Integer id){
		return rolesMapper.selectByPrimaryKey(id);
	}
	
	/**
	 * @方法名称: queryPage
	 * @功能描述: 分页查询列表数据
	 * @作者:洪丰
	 * @创建时间:2018年4月24日 下午3:58:05
	 * @param page
	 * @param limit
	 * @param searchParams
	 * @return List<Map<String,Object>>
	 */
	public List<Map<String, Object>> queryPage(int page, int limit, HashMap<String, Object> searchParams){
		int start = ((page - 1) * limit);
		int end = limit;
		searchParams.put("start", start);
		searchParams.put("end", end);
		searchParams.put("companyId",UserHelper.getCurrentCompanyId());
		return rolesMapper.selectPage(searchParams);
	}
	
	/**
	 * @方法名称: queryTotal
	 * @功能描述: 获取数据总数
	 * @作者:洪丰
	 * @创建时间:2018年4月24日 下午3:49:15
	 * @return int
	 */
	public int queryTotal(HashMap<String, Object> searchParams){
		searchParams.put("companyId",UserHelper.getCurrentCompanyId());
		return rolesMapper.selectPageCount(searchParams);
	}
	/**
	 * @方法名称: addAcc
	 * @功能描述: 新增角色
	 * @作者:洪丰
	 * @创建时间:2018年4月24日 下午1:08:05
	 * @param entity void
	 */
	public void addAcc(TRoles entity) {
		// 取得当前登录人
		ShiroUser user = UserHelper.getCurrentUser();
		entity.setCreatorId(user.getId());
		entity.setCreatorName(user.getPersonName());
		entity.setCreateTime(new Date());
		entity.setDeleteFlag(0);
		entity.settEId(user.getEntId());
		
		rolesMapper.insert(entity);
	}
	
	/**
	 * @方法名称: editAcc
	 * @功能描述: 修改角色
	 * @作者:洪丰
	 * @创建时间:2018年4月24日 下午1:25:10
	 * @param entity void
	 */
	public void editAcc(TRoles entity) {
		rolesMapper.updateByPrimaryKeySelective(entity);
	}
	
	/**
	 * @方法名称: delAccById
	 * @功能描述: 逻辑删除角色
	 * @作者:洪丰
	 * @创建时间:2018年4月24日 下午1:36:11
	 * @param id void
	 */
	public int delAccById(Integer id) {
		TRoles entity = new TRoles();
		entity.setId(id);
		entity.setDeleteFlag(1);
		return rolesMapper.updateByPrimaryKeySelective(entity);
	}
	
	/**
	 * @方法名称: queryRoleAndFun
	 * @功能描述: 获取角色和功能表数据
	 * @作者:洪丰
	 * @创建时间:2018年4月25日 下午5:33:11
	 * @param roleId
	 * @return List<TRoles>
	 */
	public List<TFunctions> queryRoleAndFun(int roleId){
		HashMap<String, Object> searchParams = new HashMap<String, Object>();
		searchParams.put("id", roleId);
		return rolesMapper.selectFunctionByRoleId(searchParams);
	}
	
	/**
	 * @方法名称: queryFunAndChildren
	 * @功能描述: 获取全部功能及其下属功能
	 * @作者:洪丰
	 * @创建时间:2018年4月25日 下午5:34:16
	 * @param roleId
	 * @return List<TRoles>
	 */
	/*public List<TFunctions> queryFunAndChildren(){
		return functionsMapper.selectFunAndChildren();
	}*/
	
	/**
	 * @方法名称: findFunctionTree
	 * @功能描述: 获取功能tree
	 * @作者: 洪丰
	 * @创建时间:2018年5月3日 下午4:54:22
	 * @param oldFunList
	 * @return String
	 */
	public String findFunctionTree(List<TFunctions> oldFunList) {
		//获取区域一级节点
		List<Map<String, Object>> node = functionsMapper.selectParentFunctions();
		/*获取生产范围列表*/
		List<Map<String, Object>> proClaList = functionsMapper.selectchildrenFunctions();
		for(Map<String, Object> function : node){
			List<Map<String, Object>> children = findChildrenTreeNode(Integer.parseInt(function.get("value").toString()),oldFunList,proClaList);
			function.put("data", children);
			for (TFunctions oldFun : oldFunList) {
				if(null == oldFun){
					continue;
				}
	            if (oldFun.getId().compareTo(Integer.parseInt(function.get("value").toString())) == 0){
	            	function.put("checked", "true");
	            }
	        }
		}
		//查询结果转换json
		String jsonArray = JSONObject.toJSONString(node);
		return jsonArray;
	}
	
	/**
	 * @方法名称: findChildrenTreeNode
	 * @功能描述: 递归查询下一级功能tree
	 * @作者: 洪丰
	 * @创建时间:2018年5月3日 下午4:56:19
	 * @param pId
	 * @param oldFunList
	 * @return List<Map<String,Object>>
	 */
	public List<Map<String, Object>> findChildrenTreeNode(Integer pId, List<TFunctions> oldFunList, List<Map<String, Object>> proClaList){
		List<Map<String, Object>> funClaNode = new ArrayList<>();
		for(Map<String, Object> funMap : proClaList){
			if(pId.equals(funMap.get("pId"))){
				List<Map<String, Object>> children = findChildrenTreeNode(Integer.parseInt(funMap.get("value").toString()), oldFunList, proClaList);
				funMap.put("data", children);
				for (TFunctions oldFun : oldFunList) {
					if(null == oldFun){
						continue;
					}
		            if (oldFun.getId().compareTo(Integer.parseInt(funMap.get("value").toString())) == 0){
		            	funMap.put("checked", "true");
		            }
		        }
				funClaNode.add(funMap);
			}
		}
		return funClaNode;
	}
	
	/**
	 * @方法名称: editAccFun
	 * @功能描述: 更新角色功能
	 * @作者:洪丰
	 * @创建时间:2018年4月25日 下午5:45:24
	 * @param funIdArray void
	 */
	public void editAccFun(String funIds, int roleId) {
		rolesMapper.deleteRolefunctions(roleId);
		if(null != funIds && !"".equals(funIds)){
			String[] funIdArray = funIds.replace(" ", "").split(",");  
		    Arrays.sort(funIdArray);  
		    Set<String> functionIdSet = new HashSet<>();  
		    functionIdSet.addAll(Arrays.asList(funIdArray));  
		    
			List<Map<String, Object>> ids = Lists.newArrayList();
			for(String funId : functionIdSet){
				Map<String, Object> idMap = new HashMap<String, Object>();
				idMap.put("roledId", roleId);
				idMap.put("funId", funId);
				ids.add(idMap);
			}
			rolesMapper.insertStudentAutoKey(ids);
		}
	}
	
	/**
	 * @方法名称: queryRoleByRecord
	 * @功能描述: 通过record获取角色信息
	 * @作者: 洪丰
	 * @创建时间: 2018年4月28日 上午10:09:38
	 * @param record
	 * @return int
	 */
	public int queryRoleByRecord(TRoles record){
		ShiroUser user = UserHelper.getCurrentUser();
		record.setDeleteFlag(0);
		record.settEId(user.getEntId());
		List<TRoles> roleLsit = rolesMapper.select(record);
		return roleLsit.size();
	}
    
    /**
     * 根据企业查询当前企业下面的所有角色
     * @param currentCompanyId
     * @return
     */
    public List<TRoles> queryRoleByCompany(Integer currentCompanyId) {
        return rolesMapper.selectRolesByCompany(currentCompanyId);
    }
    
    /**
     * 查询我的账号的权限
     * @param id
     * @return
     */
    public List<TRoles> queryRolesAndRoleByAccount(Integer id) {
        return  rolesMapper.queryRoleByAccount(id);
    }
}
